{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "\n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#from sklearn.metrics import log_loss  \n",
    "#SVM并不能直接输出各类的概率，所以在这个例子中我们用正确率作为模型预测性能的度量\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取数据 & 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "# path to where the data lies\n",
    "dpath = 'C:/Users/Administrator/Desktop/AI/Work/HW2/'\n",
    "train = pd.read_csv(dpath +\"diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 61878 entries, 0 to 61877\n",
      "Data columns (total 95 columns):\n",
      "id         61878 non-null int64\n",
      "feat_1     61878 non-null int64\n",
      "feat_2     61878 non-null int64\n",
      "feat_3     61878 non-null int64\n",
      "feat_4     61878 non-null int64\n",
      "feat_5     61878 non-null int64\n",
      "feat_6     61878 non-null int64\n",
      "feat_7     61878 non-null int64\n",
      "feat_8     61878 non-null int64\n",
      "feat_9     61878 non-null int64\n",
      "feat_10    61878 non-null int64\n",
      "feat_11    61878 non-null int64\n",
      "feat_12    61878 non-null int64\n",
      "feat_13    61878 non-null int64\n",
      "feat_14    61878 non-null int64\n",
      "feat_15    61878 non-null int64\n",
      "feat_16    61878 non-null int64\n",
      "feat_17    61878 non-null int64\n",
      "feat_18    61878 non-null int64\n",
      "feat_19    61878 non-null int64\n",
      "feat_20    61878 non-null int64\n",
      "feat_21    61878 non-null int64\n",
      "feat_22    61878 non-null int64\n",
      "feat_23    61878 non-null int64\n",
      "feat_24    61878 non-null int64\n",
      "feat_25    61878 non-null int64\n",
      "feat_26    61878 non-null int64\n",
      "feat_27    61878 non-null int64\n",
      "feat_28    61878 non-null int64\n",
      "feat_29    61878 non-null int64\n",
      "feat_30    61878 non-null int64\n",
      "feat_31    61878 non-null int64\n",
      "feat_32    61878 non-null int64\n",
      "feat_33    61878 non-null int64\n",
      "feat_34    61878 non-null int64\n",
      "feat_35    61878 non-null int64\n",
      "feat_36    61878 non-null int64\n",
      "feat_37    61878 non-null int64\n",
      "feat_38    61878 non-null int64\n",
      "feat_39    61878 non-null int64\n",
      "feat_40    61878 non-null int64\n",
      "feat_41    61878 non-null int64\n",
      "feat_42    61878 non-null int64\n",
      "feat_43    61878 non-null int64\n",
      "feat_44    61878 non-null int64\n",
      "feat_45    61878 non-null int64\n",
      "feat_46    61878 non-null int64\n",
      "feat_47    61878 non-null int64\n",
      "feat_48    61878 non-null int64\n",
      "feat_49    61878 non-null int64\n",
      "feat_50    61878 non-null int64\n",
      "feat_51    61878 non-null int64\n",
      "feat_52    61878 non-null int64\n",
      "feat_53    61878 non-null int64\n",
      "feat_54    61878 non-null int64\n",
      "feat_55    61878 non-null int64\n",
      "feat_56    61878 non-null int64\n",
      "feat_57    61878 non-null int64\n",
      "feat_58    61878 non-null int64\n",
      "feat_59    61878 non-null int64\n",
      "feat_60    61878 non-null int64\n",
      "feat_61    61878 non-null int64\n",
      "feat_62    61878 non-null int64\n",
      "feat_63    61878 non-null int64\n",
      "feat_64    61878 non-null int64\n",
      "feat_65    61878 non-null int64\n",
      "feat_66    61878 non-null int64\n",
      "feat_67    61878 non-null int64\n",
      "feat_68    61878 non-null int64\n",
      "feat_69    61878 non-null int64\n",
      "feat_70    61878 non-null int64\n",
      "feat_71    61878 non-null int64\n",
      "feat_72    61878 non-null int64\n",
      "feat_73    61878 non-null int64\n",
      "feat_74    61878 non-null int64\n",
      "feat_75    61878 non-null int64\n",
      "feat_76    61878 non-null int64\n",
      "feat_77    61878 non-null int64\n",
      "feat_78    61878 non-null int64\n",
      "feat_79    61878 non-null int64\n",
      "feat_80    61878 non-null int64\n",
      "feat_81    61878 non-null int64\n",
      "feat_82    61878 non-null int64\n",
      "feat_83    61878 non-null int64\n",
      "feat_84    61878 non-null int64\n",
      "feat_85    61878 non-null int64\n",
      "feat_86    61878 non-null int64\n",
      "feat_87    61878 non-null int64\n",
      "feat_88    61878 non-null int64\n",
      "feat_89    61878 non-null int64\n",
      "feat_90    61878 non-null int64\n",
      "feat_91    61878 non-null int64\n",
      "feat_92    61878 non-null int64\n",
      "feat_93    61878 non-null int64\n",
      "target     61878 non-null object\n",
      "dtypes: int64(94), object(1)\n",
      "memory usage: 44.8+ MB\n"
     ]
    }
   ],
   "source": [
    "#train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 各属性的统计特性\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xec167f0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Target 分布，看看各类样本分布是否均衡\n",
    "sns.countplot(train.Outcome);\n",
    "pyplot.xlabel('Outcome');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各类样本不均衡。交叉验证对分类任务缺省的是采用StratifiedKFold，在每折采样时根据各类样本按比例采样"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 将类别字符串变成数字\n",
    "\n",
    "\n",
    "#得到目标值\n",
    "\n",
    "y_train = train['Outcome']\n",
    "\n",
    "#得到训练特征\n",
    "x_train = train.drop('Outcome',axis=1)\n",
    "\n",
    "X_train = np.array(x_train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)\n",
    "#X_test = ss_X.transform(X_test)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "J:\\MyInstall\\Anaconda2\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2026: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "# 训练样本6w+，交叉验证太慢，用train_test_split估计模型性能\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train_part, X_val, y_train_part, y_val = train_test_split(X_train, y_train, train_size = 0.8,random_state = 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### default SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#LinearSVC不能得到每类的概率，在Otto数据集要求输出每类的概率，这里只是示意SVM的使用方法\n",
    "#https://xacecask2.gitbooks.io/scikit-learn-user-guide-chinese-version/content/sec1.4.html\n",
    "#1.4.1.2. 得分与概率\n",
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "SVC1 = LinearSVC().fit(X_train_part, y_train_part)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.84      0.92      0.88       107\n",
      "          1       0.76      0.62      0.68        47\n",
      "\n",
      "avg / total       0.82      0.82      0.82       154\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[98  9]\n",
      " [18 29]]\n"
     ]
    }
   ],
   "source": [
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(X_val)\n",
    "\n",
    "from sklearn.metrics import classification_report\n",
    "\n",
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, classification_report(y_val, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % confusion_matrix(y_val, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性SVM正则参数调优"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线性SVM LinearSVC的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1） \n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.805194805195\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.785714285714\n",
      "accuracy: 0.746753246753\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYsAAAEKCAYAAADjDHn2AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAH65JREFUeJzt3XucVHX9x/HXR66mIAhoBgqUZKIp\n6qIWlqn58w6ileAlwXt5V+SmpqIIipfM1IS8JBqIKBcvZd5SK2+7AhoghqaykgYqKggh8vn98T2b\nGyzMMDtnvnN5Px+PebAze2bmPQ/dfe855/s9X3N3RERE1mej2AFERKT4qSxERCQjlYWIiGSkshAR\nkYxUFiIikpHKQkREMlJZiIhIRioLERHJSGUhIiIZNY0dIF/at2/vXbp0iR1DRKSk1NTULHb3Dpm2\nK5uy6NKlC9XV1bFjiIiUFDN7O5vtdBhKREQyUlmIiEhGKgsREcmobM5ZiIhUus8//5za2lpWrFix\n1vdatmxJp06daNasWU6vrbIQESkTtbW1tGrVii5dumBm/33c3fnggw+ora2la9euOb22DkOJiJSJ\nFStW0K5du/8pCgAzo127dg3ucWRLZSEiUkbWLIpMj2dLh6HKyOLFMG4cLF8eO4mUq+bN4cwzYbPN\nYieRQlNZlIkVK6BPH/jb36CRf0CIrJM7LFsGo0bFTiKFprIoA+5wyimhKO67D370o9iJpFz16wc3\n3QRDhkCbNrHTSEPcvcFDTu7eqNfVOYsycPXVMH48jBihopB0DRsGn34aCkOKT8uWLfnggw/WKoa6\n0VAtW7bM+bWtsW1TLKqqqrwSrw01bRr07QtHHQW//70OQUn6Dj0UXngB3noLNtkkdhqpL5d5FmZW\n4+5VmV5bh6FK2KxZcMwxUFUFt9+uopDCGD4cevWC3/4Wzj47dhqpr1mzZjnPo8hEh6FK1Pvvw2GH\nhePG06bBxhvHTiSV4rvfhb33hjFjYOXK2GmkUFQWJWjFinDoafFimD4dttoqdiKpNMOHw7vvhnNl\nUhlUFiXGHU4+GZ57Lvyg7rpr7ERSifbfH3bbDUaPhi++iJ1GCkFlUWKuugruvhsuvxyOPDJ2GqlU\nZmHvYv58mDw5dhopBI2GKiFTp4bDT/37wz336IS2xLV6NeywQ5jVPXOm/n8sVdmOhtKeRYmYOROO\nPRZ23x1uu00/mBLfRhuFeRevvAKPPBI7jaRNZVEC3nsPeveGtm3D3oVGPkmx6N8fOneGkSPD+TQp\nXyqLIlc38umDDzTySYpPs2YweHAYcPHMM7HTSJpUFkXMHU46CZ5/Pox82mWX2IlE1jZwIGy5JVx5\nZewkkiaVRREbPTqcyL7iCjjiiNhpRBq28cZw3nnwpz9BmY8xqWgqiyI1ZUoYmnj00eFfkWJ22mnh\nagK6dHn5UlkUoRkzwsinPfbQyCcpDa1bh0WRHngA5syJnUbSoLIoMnUjn9q1CyOfGnFFYZGCOuss\n+MpXwsRRKT8qiyKyYgUcfjh8+GEY+fTVr8ZOJJK99u3h1FPDeba33oqdRvJNZVEk3OHEE8M6AXff\nDT16xE4ksuHOPz9M1hszJnYSyTeVRZG48sqweNHIkWFehUgp6tgRBgwI59reey92GsknlUUReOAB\nuOiisJDRsGGx04g0zuDB8PnncP31sZNIPqksIpsxA447DvbcM6w8ppFPUuq23TYs83vzzfDRR7HT\nSL6kWhZmdqCZzTOz+WY2tIHvb2NmT5nZDDN7xcwOTh7f38xqzOzV5N9908wZy7/+9eXIpylTNPJJ\nysfQobB0Kfz617GTSL6kVhZm1gS4CTgI6A70N7Pua2x2ETDJ3XcB+gE3J48vBg5z928DxwNltx7X\n8uUa+STla6edwrK/v/xlKA0pfWnuWewOzHf3N919JTAR6LPGNg60Tr7eDFgI4O4z3H1h8vhsoKWZ\ntUgxa0HVjXx68cUwzFAjn6QcDR8e/hgaNy52EsmHNMuiI7Cg3v3a5LH6LgWONbNa4BHgzAZe50hg\nhrv/Z81vmNkpZlZtZtWLFi3KT+oCGDkSJkwII6AOPzx2GpF07Lkn7LMPXHMN/Getn14pNWmWRUOn\nate84n1/4E537wQcDIw3s/9mMrMdgKuAUxt6A3cf6+5V7l7VoUOHPMVO1/33w8UXh8t5DF3rLI5I\neRk+HBYuhLvuip1EGivNsqgFtq53vxPJYaZ6TgQmAbj7c0BLoD2AmXUCpgA/dfc3UsxZMC+//OXI\np3HjNPJJyt9++0HPnuESIKtWxU4jjZFmWbwEdDOzrmbWnHACe/oa27wD7AdgZtsTymKRmbUBHgaG\nuftfU8xYMHUjn9q31zWfpHKYhb2LN96A++6LnUYaI7WycPdVwBnAo8Bcwqin2WY2wsx6J5udD5xs\nZrOACcAAd/fkedsCF5vZzOS2RVpZ07Z8OfTpA0uWwIMPhoViRCpF797QvXs4R7d6dew0kivzMlk4\nt6qqyquLcOUV97Amxb33hpnaOqEtlejuu8Mh2OnTw5BaKR5mVuPuVZm20wzulF1xBUycqJFPUtn6\n9YMuXcJIwDL5+7TiqCxSNHky/OIX4S+qIUNipxGJp2nT8DPwwgvw5z/HTiO5UFmkpKYGfvpT+M53\nYOxYjXwSGTAgXKngyitjJ5FcqCxSsHBhOKHdoYOu+SRSp2XLsN7F44+HqxdIaVFZ5FndNZ808klk\nbaeeCm3bwqhRsZPIhlJZ5JE7DBwI1dVhIaOddoqdSKS4tGoV1uqeOhVmz46dRjaEyiKPLr88DJEd\nNSqMLReRtZ15JmyyCYweHTuJbAiVRZ7cdx9cckk4qT14cOw0IsWrXTs47bRwMc0334ydRrKlssiD\nmho4/nj47nc18kkkG+edB02awJgxsZNItlQWjbRwYTjkVDfyqUXZrLohkp6vfS2c37v99nDdNCl+\nKotG+OyzMET244/DyKctSvbqVSKFN3hwuBLtddfFTiLZUFnkqG7kU02NRj6J5OLrX4f+/eGWW8KK\nelLcVBY5GjECJk0KIzo08kkkN0OHwrJlcOONsZNIJiqLHEyaBJdeGk5qX3BB7DQipWvHHcOh3Btu\ngE8/jZ1G1kdlsYGqq0NJ9OoFt96qkU8ijTVsGHz0URhJKMVLZbEB3n03/BW05ZZhbQqNfBJpvD32\nCMuvXnstrFgRO42si8oiS3Ujnz75RCOfRPJt+PAwhPZ3v4udRNZFZZGF1avD5ZVffjmMfPr2t2Mn\nEikv++wT9jCuuioMp5Xio7LIwogR4XIeV12lJSFF0mAW9i7++c+wsqQUH5VFBvfeC5ddFvYsBg2K\nnUakfB16aBgdNWpU2JuX4qKyWI+XXgolsdde8JvfaOSTSJo22iiMjJozB6ZPj51G1qSyWIe6kU9f\n/apGPokUyk9+EmZ2X3lluEqCFA+VRQPqRj59+mkY+dShQ+xEIpWhaVMYMiTs1T/xROw0Up/KYg2r\nV4dJdy+/HK63v+OOsROJVJbjj4ettgp7F1I8VBZruOwymDwZrr46nHATkcJq0SIMJnnqKXjuudhp\npI7Kop6JE8Mw2YED4fzzY6cRqVynnAKbbx5GRklxUFkkXnwxlMRee4VLJmvkk0g8m24KZ58dzhm+\n8krsNAIqCwBqa+HwwzXySaSYnHFGKI3Ro2MnEVBZsGyZRj6JFKPNN4ef/SxMjJ0/P3Yaqfiy+PDD\ncKXLiRM18kmk2Jx7LjRrFgacSFwVXxZbbw2zZsEhh8ROIiJr2morOOEEuPPOMFFW4qn4soAwEUhE\nitMFF4T5T9deGztJZVNZiEhR69oVjj46rEy5eHHsNJVLZSEiRW/o0HAZnl/9KnaSyqWyEJGi1707\n9O0LN94YVquUwlNZiEhJGDYMliwJywVI4aksRKQk9OwJ++8P110Hy5fHTlN5VBYiUjKGD4f334c7\n7oidpPKkWhZmdqCZzTOz+WY2tIHvb2NmT5nZDDN7xcwOrve9Ycnz5pnZAWnmFJHSsPfe8J3vhEl6\nn38eO01lSa0szKwJcBNwENAd6G9m3dfY7CJgkrvvAvQDbk6e2z25vwNwIHBz8noiUsHMwt7F22+H\n9WakcNLcs9gdmO/ub7r7SmAi0GeNbRxonXy9GbAw+boPMNHd/+Pu/wTmJ68nIhXukENgp53C5ctX\nr46dpnKkWRYdgQX17tcmj9V3KXCsmdUCjwBnbsBzMbNTzKzazKoXLVqUr9wiUsTMwsio116DqVNj\np6kcaZZFQytCrLkEe3/gTnfvBBwMjDezjbJ8Lu4+1t2r3L2qgy4XK1Ixfvxj2HbbsPSqr/WbQdKQ\nZlnUAlvXu9+JLw8z1TkRmATg7s8BLYH2WT5XRCpUkyYwZAjU1MBjj8VOUxnSLIuXgG5m1tXMmhNO\nWE9fY5t3gP0AzGx7QlksSrbrZ2YtzKwr0A14McWsIlJijjsOOnYMexeSvtTKwt1XAWcAjwJzCaOe\nZpvZCDPrnWx2PnCymc0CJgADPJhN2OOYA/wRON3dv0grq4iUnhYtYNAgePpp+OtfY6cpf+ZlcsCv\nqqrKq6urY8cQkQJatgw6d4Y994SHHoqdpjSZWY27V2XaLqs9CzO738wOSU4+i4gUhU02gXPOgYcf\nhpkzY6cpb9n+8r8FOBr4h5mNNrNvpZhJRCRrp58OrVrB6NGxk5S3rMrC3R9392OAXYG3gMfM7G9m\nNtDMmqUZUERkfdq2hZ//HCZNgtdfj52mfGV9WMnM2gEDgJOAGcANhPLQwDURiercc8MJ76uvjp2k\nfGV7zuIB4FngK8Bh7t7b3e919zOBTdMMKCKSyZZbwoknwl13wYIFmbeXDZftnsWv3b27u49y93/V\n/0Y2Z9FFRNJ2wQVhNve118ZOUp6yLYvtzaxN3R0za2tmP08pk4jIBuvcGY45BsaOBV0qLv+yLYuT\n3X1J3R13/wg4OZ1IIiK5GTIEVqyAG26InaT8ZFsWG5nZfy/ul6wt0TydSCIiudl+ezjiCPj1r+Hj\nj2OnKS/ZlsWjwCQz28/M9iVcmuOP6cUSEcnNsGGhKG65JXaS8pJtWQwBngR+BpwOPAEMTiuUiEiu\ndtsNDjgArrsOPvssdpryke2kvNXufou7/8jdj3T3W3VhPxEpVsOHh5Pct98eO0n5yHaeRTczm2xm\nc8zszbpb2uFERHLxve9Br15hkt7KlbHTlIdsD0PdQbg+1CpgH+AuYHxaoUREGsMs7F0sWAC//33s\nNOUh27LY2N2fIFzS/G13vxTYN71YIiKNc9BBsPPO4QKDX+igeaNlWxYrksuT/8PMzjCzvsAWKeYS\nEWmUur2LefNgypTYaUpftmVxDuG6UGcBuwHHAsenFUpEJB+OPBK6dQtLr5bJOm/RZCyLZALeT9x9\nqbvXuvvAZETU8wXIJyKSsyZNYOhQmDEDHn00dprSlrEskiGyu9WfwS0iUiqOPRY6dQp7F5K7bA9D\nzQCmmdlxZnZE3S3NYCIi+dC8ebgi7bPPhpvkJtuy2Bz4gDAC6rDkdmhaoURE8umkk6B9exg1KnaS\n0tU0m43cfWDaQURE0vKVr4TV9C68MJy/2GWX2IlKj3kWQwTM7A5grQ3d/YQ0QuWiqqrKq6urY8cQ\nkSK1ZElY8+KAA8J63RKYWU02i9hlexjqIeDh5PYE0BpYmns8EZHCatMGTj8dJk8Ocy9kw2R7IcH7\n693uAX4C7JhuNBGR/DrnHGjRAq66KnaS0pPtnsWaugHb5DOIiEjattgCTj4Zxo+Hd96Jnaa0ZHvV\n2U/N7JO6G/AgYY0LEZGSMmhQ+Peaa+LmKDXZHoZq5e6t692+6e73px1ORCTfttkGjjsOxo2Dd9+N\nnaZ0ZLtn0dfMNqt3v42ZHZ5eLBGR9Fx8MaxeHf6V7GR7zuISd//v8ufuvgS4JJ1IIiLp6toVzjwT\n7rwTZs2KnaY0ZFsWDW2X1YQ+EZFidOGF0LZtOIehK9Jmlm1ZVJvZdWb2DTP7upldD9SkGUxEJE1t\n28IvfgGPPw5//GPsNMUv27I4E1gJ3AtMApYDp6cVSkSkEH72M/jGN8LexapVsdMUt2xHQy1z96Hu\nXpXchrv7srTDiYikqXnzMEFvzhy4447YaYpbtqOhHjOzNvXutzUzLSUiIiXviCOgV68wMurTT2On\nKV7ZHoZqn4yAAsDdP0JrcItIGTCDa6+F99+HMWNipyle2ZbFajP77+U9zKwLDVyFVkSkFO2xBxx1\nVJjVrYl6Dcu2LC4E/mJm481sPPA0MCzTk8zsQDObZ2bzzWxoA9+/3sxmJrfXzWxJve9dbWazzWyu\nmf1Ky7qKSJpGjYIvvoCLLoqdpDhle4L7j0AVMI8wIup8woiodTKzJsBNwEFAd6C/mXVf43XPdfce\n7t4DuBF4IHnud4FewE6Eq9v2BPbO/mOJiGyYrl3hrLPgd7+DmTNjpyk+2Z7gPomwjsX5yW08cGmG\np+0OzHf3N919JTAR6LOe7fsDE5KvHWgJNAdaAM2A97PJKiKSq+HDNVFvXbI9DHU24a/7t919H2AX\nYFGG53QEFtS7X5s8thYz6wx0BZ4EcPfngKeAfyW3R919bpZZRURy0rYtXHIJPPEE/OEPsdMUl2zL\nYoW7rwAwsxbu/hqwXYbnNHSOYV1d3Q+Y7O5fJO+xLbA90IlQMPua2ffXegOzU8ys2syqFy3K1F0i\nIpmddhpsuy1ccIEm6tWXbVnUJvMspgKPmdk0YGGm5wBb17vfaT3P6ceXh6AA+gLPu/tSd18K/AHY\nc80nufvYuomCHTp0yPKjiIisW/2JerfdFjtN8cj2BHdfd1/i7pcCFwO3AZkuUf4S0M3MuppZc0Ih\nTF9zIzPbDmgLPFfv4XeAvc2sqZk1I5zc1mEoESmIvn1hr73CtaM0US/Y4GVV3f1pd5+enLRe33ar\ngDOARwm/6Ce5+2wzG2Fmvett2h+Y6P4/p5MmA28ArwKzgFnu/uCGZhURyYVZmHPx73/D1VfHTlMc\nzMvklH9VVZVXV1fHjiEiZaR/f5g2DV5/HTp1ip0mHWZW4+5Vmbbb4D0LEZFKoYl6X1JZiIisQ5cu\ncPbZcNddMGNG7DRxqSxERNZj+HDYfHNN1FNZiIisR5s2YaLek0/CI4/EThOPykJEJINTT4Vu3Sp7\nop7KQkQkg+bNwxDauXPht7+NnSYOlYWISBb69IHvfS8ckvrkk9hpCk9lISKShboV9Sp1op7KQkQk\nSz17wtFHh9JYsCDz9uVEZSEisgFGjgxDaCttop7KQkRkA9RN1Bs/Hl5+OXaawlFZiIhsoEqcqKey\nEBHZQJttBpdeCk89BQ8/HDtNYagsRERycOqp8M1vVs5EPZWFiEgOmjULQ2hfew3GjYudJn0qCxGR\nHPXuDd//fmVM1FNZiIjkqG6i3qJFYd3ucqayEBFphKoqOOYYuO668p6op7IQEWmkuol6F14YO0l6\nVBYiIo3UuTOcc055T9RTWYiI5MGwYdC+PZx/fnlO1FNZiIjkQd1EvT//GR56KHaa/FNZiIjkySmn\nwHbbhYl6n38eO01+qSxERPKkbqLevHnlN1FPZSEikkeHHQZ77x0m6n38cew0+aOyEBHJIzO45hpY\nvLi8JuqpLERE8qyqCo49Fq6/Ht55J3aa/FBZiIikYOTI8G+5TNRTWYiIpGCbbeDcc+Huu6GmJnaa\nxlNZiIikZOhQ6NChPCbqqSxERFLSunWYqPf00/Dgg7HTNI7KQkQkRSefDN/6FgweXNoT9VQWIiIp\nqj9Rb+zY2Glyp7IQEUnZoYfCD34QDkmV6kQ9lYWISMrqVtRbvBhGj46dJjcqCxGRAth1VzjuuDBR\n7+23Y6fZcCoLEZECGTky7GWU4kQ9lYWISIFsvTWcdx7ccw9UV8dOs2FSLQszO9DM5pnZfDMb2sD3\nrzezmcntdTNbUu9725jZn8xsrpnNMbMuaWYVESmEIUNKc6JeamVhZk2Am4CDgO5AfzPrXn8bdz/X\n3Xu4ew/gRuCBet++Cxjj7tsDuwP/TiuriEihtG4Nl10GzzwD06fHTpO9NPcsdgfmu/ub7r4SmAj0\nWc/2/YEJAEmpNHX3xwDcfam7f5ZiVhGRginFiXpplkVHYEG9+7XJY2sxs85AV+DJ5KFvAkvM7AEz\nm2FmY5I9FRGRkte0KYwZA6+/DrfeGjtNdtIsC2vgsXUdoesHTHb3L5L7TYHvAYOAnsDXgQFrvYHZ\nKWZWbWbVixYtanxiEZECOeQQ2Gef0pmol2ZZ1AJb17vfCVi4jm37kRyCqvfcGckhrFXAVGDXNZ/k\n7mPdvcrdqzp06JCn2CIi6aubqPfhhzBqVOw0maVZFi8B3cysq5k1JxTCWqdzzGw7oC3w3BrPbWtm\ndQ2wLzAnxawiIgW3yy5hot4vfwlvvRU7zfqlVhbJHsEZwKPAXGCSu882sxFm1rvepv2Bie5fDiJL\nDkcNAp4ws1cJh7TGpZVVRCSWK64ojYl65qU00Hc9qqqqvLrUZrmIiAAXXRRmd7/4IvTsWdj3NrMa\nd6/KtJ1mcIuIRDZkCGyxRXFP1FNZiIhE1qpVmKj37LMwbVrsNA1TWYiIFIGTToLtty/eiXoqCxGR\nIlA3Ue8f/4Df/CZ2mrWpLEREisTBB8O++4ZDUkuWZN6+kFQWIiJFopgn6qksRESKSI8e8NOfFt9E\nPZWFiEiRueIKaNIEhg+PneRLKgsRkSLTqVOYczFhQpioVwxUFiIiRWjwYNhyy+KZqKeyEBEpQq1a\nwYgR8Je/wNSpsdOoLEREitYJJ0D37mEvY+XKuFlUFiIiRapuot78+fEn6qksRESK2EEHwQ9/GH+i\nnspCRKSImYW9i48+giuvjJdDZSEiUuR69IDjj4cbboB//jNOBpWFiEgJiD1RT2UhIlICOnaEQYNg\n4kR44YXCv7/KQkSkRFxwQbyJeioLEZES0aoVXH45/PWvMGVKYd9bZSEiUkIGDoQddgjrdhdyop7K\nQkSkhNSfqHfLLYV7X5WFiEiJOfBA2H//cO2ojz4qzHuqLERESkyMiXoqCxGRErTzzjBgAPzqV4WZ\nqKeyEBEpUZdfHs5hDBuW/ns1Tf8tREQkDR07wsUXw7JlYd6FWXrvpbIQESlhQ4cW5n10GEpERDJS\nWYiISEYqCxERyUhlISIiGaksREQkI5WFiIhkpLIQEZGMVBYiIpKReaGXW0qJmS0C3m7ES7QHFucp\nTkzl8jlAn6VYlctnKZfPAY37LJ3dvUOmjcqmLBrLzKrdvSp2jsYql88B+izFqlw+S7l8DijMZ9Fh\nKBERyUhlISIiGaksvjQ2doA8KZfPAfosxapcPku5fA4owGfROQsREclIexYiIpKRyiJhZpeb2Stm\nNtPM/mRmX4udKVdmNsbMXks+zxQzaxM7U67M7MdmNtvMVptZyY1cMbMDzWyemc03swKtPJAOM7vd\nzP5tZn+PnaUxzGxrM3vKzOYm/2+dHTtTrsyspZm9aGazks9yWWrvpcNQgZm1dvdPkq/PArq7+2mR\nY+XEzP4PeNLdV5nZVQDuPiRyrJyY2fbAauBWYJC7V0eOlDUzawK8DuwP1AIvAf3dfU7UYDkys+8D\nS4G73H3H2HlyZWZbAVu5+8tm1gqoAQ4vxf8uZmbAJu6+1MyaAX8Bznb35/P9XtqzSNQVRWIToGRb\n1N3/5O6rkrvPA51i5mkMd5/r7vNi58jR7sB8d3/T3VcCE4E+kTPlzN2fAT6MnaOx3P1f7v5y8vWn\nwFygY9xUufFgaXK3WXJL5XeXyqIeMxtpZguAY4BfxM6TJycAf4gdokJ1BBbUu19Lif5SKldm1gXY\nBXghbpLcmVkTM5sJ/Bt4zN1T+SwVVRZm9riZ/b2BWx8Ad7/Q3bcG7gHOiJt2/TJ9lmSbC4FVhM9T\ntLL5LCXKGnisZPdYy42ZbQrcD5yzxpGFkuLuX7h7D8IRhN3NLJVDhE3TeNFi5e4/zHLT3wMPA5ek\nGKdRMn0WMzseOBTYz4v8xNQG/HcpNbXA1vXudwIWRsoi9STH9+8H7nH3B2LnyQd3X2JmfwYOBPI+\nCKGi9izWx8y61bvbG3gtVpbGMrMDgSFAb3f/LHaeCvYS0M3MuppZc6AfMD1ypoqXnBS+DZjr7tfF\nztMYZtahbrSjmW0M/JCUfndpNFTCzO4HtiOMvHkbOM3d342bKjdmNh9oAXyQPPR8CY/s6gvcCHQA\nlgAz3f2AuKmyZ2YHA78EmgC3u/vIyJFyZmYTgB8QrnD6PnCJu98WNVQOzGwv4FngVcLPO8Bwd38k\nXqrcmNlOwO8I/39tBExy9xGpvJfKQkREMtFhKBERyUhlISIiGaksREQkI5WFiIhkpLIQEZGMVBYi\nG8DMlmbear3Pn2xmX0++3tTMbjWzN5Irhj5jZnuYWfPk64qaNCvFTWUhUiBmtgPQxN3fTB76LeHC\nfN3cfQdgANA+uejgE8BRUYKKNEBlIZIDC8Yk17B61cyOSh7fyMxuTvYUHjKzR8zsR8nTjgGmJdt9\nA9gDuMjdVwMkV6d9ONl2arK9SFHQbq5Ibo4AegA7E2Y0v2RmzwC9gC7At4EtCJe/vj15Ti9gQvL1\nDoTZ6F+s4/X/DvRMJblIDrRnIZKbvYAJyRU/3weeJvxy3wu4z91Xu/t7wFP1nrMVsCibF09KZGWy\nOI9IdCoLkdw0dPnx9T0OsBxomXw9G9jZzNb3M9gCWJFDNpG8U1mI5OYZ4Khk4ZkOwPeBFwnLWh6Z\nnLvYknDhvTpzgW0B3P0NoBq4LLkKKmbWrW4NDzNrByxy988L9YFE1kdlIZKbKcArwCzgSWBwctjp\nfsI6Fn8nrBv+AvBx8pyH+d/yOAn4KjDfzF4FxvHlehf7ACV3FVQpX7rqrEiemdmm7r402Tt4Eejl\n7u8l6w08ldxf14ntutd4ABhWwuuPS5nRaCiR/HsoWZCmOXB5sseBuy83s0sI63C/s64nJwslTVVR\nSDHRnoWIiGSkcxYiIpKRykJERDJSWYiISEYqCxERyUhlISIiGaksREQko/8H8pF8txLEofMAAAAA\nSUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xea40c88>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-3, 3, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "#penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "#    for j, penalty in enumerate(penalty_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train, y_train, X_val, y_val)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_HW2.png' )\n",
    "\n",
    "pyplot.show()\n",
    "  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RBF核SVM正则参数调优\n",
    "\n",
    "RBF核是SVM最常用的核函数。\n",
    "RBF核SVM 的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和核函数的宽度gamma\n",
    "C越小，决策边界越平滑； \n",
    "gamma越小，决策边界越平滑。\n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.74025974026\n",
      "accuracy: 0.818181818182\n",
      "accuracy: 0.805194805195\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.720779220779\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.837662337662\n",
      "accuracy: 0.87012987013\n",
      "accuracy: 0.935064935065\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.824675324675\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.837662337662\n",
      "accuracy: 0.922077922078\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.818181818182\n",
      "accuracy: 0.824675324675\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.896103896104\n",
      "accuracy: 0.993506493506\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-3, 2, 10)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从上述部分运行结果来看，gamma参数设置不合适（gamma越大，对应RBF核的sigma越小，决策边界更复杂，可能发生了过拟合）\n",
    "所以调小gamma值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.694805194805\n",
      "accuracy: 0.694805194805\n",
      "accuracy: 0.785714285714\n",
      "accuracy: 0.818181818182\n",
      "accuracy: 0.720779220779\n",
      "accuracy: 0.837662337662\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.850649350649\n",
      "accuracy: 0.824675324675\n",
      "accuracy: 0.831168831169\n",
      "accuracy: 0.811688311688\n",
      "accuracy: 0.902597402597\n",
      "accuracy: 0.818181818182\n",
      "accuracy: 0.824675324675\n",
      "accuracy: 0.850649350649\n",
      "accuracy: 0.928571428571\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-1, 2, 4)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-3, -1, 4)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x102be978>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_HW2.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
